package com.spring.boot.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/10/25 12:29
 * @Description
 */
@Controller
@RequestMapping("/api")
public class FileUploadController {

    @GetMapping("/index")
    public String index() {
        return "index";
    }

    @PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file) {
        try {
            // 获取文件名称
            String originalFilename = file.getOriginalFilename();
            // 获取文件上传的目录路径
            // 获取 classpath 类路径
            String path = ResourceUtils.getURL("classpath:").getPath();
            // 将文件上传到 【classpath:/static/files】目录下面
            path += "/static/files/";
            // 创建 File 文件目录对象
            File filePath = new File(path);
            // 判断文件目录是否存在
            if (!filePath.exists()) {
                // 目录不存在, 则创建目录
                filePath.mkdirs();
            }
            // 创建上传之后的文件全路径名称
            File uploadPath = new File(filePath, originalFilename);
            // 上传文件
            file.transferTo(uploadPath);
        } catch (Exception e) {
            e.printStackTrace();
            return "文件上传失败";
        }
        return "文件上传成功";
    }

    @GetMapping("/download")
    @ResponseBody
    public String download(String filename, HttpServletResponse response) {
        try {
            // 读取文件
            String path = ResourceUtils.getURL("classpath:").getPath();
            path += "/static/files/" + filename;
            // 创建文件对象
            File file = new File(path);
            // 将文件以输入流的形式读取
            FileInputStream fis = new FileInputStream(file);
            // 获取缓冲字符集
            BufferedReader reader = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8));

            // 设置 response 响应头 等信息
            response.reset(); // 垂直响应流
            // 设置响应类型是：流
            response.setHeader("content-type", "application/octet-stream");
            // 设置响应内容位置, 这里是以附件的形式响应给客户端
            // 这里需要通过 URLEncoder 进行编码，否则中文名称会乱码
            response.setHeader("content-disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
            // 设置响应字符集
            response.setCharacterEncoding("UTF-8");
            // 获取输出流对象
            PrintWriter out = response.getWriter();
            // 从输入流读取数据,通过输出流响应给浏览器
            String line;
            while ((line = reader.readLine()) != null) {
                out.write(line);
            }

            // 响应结束,关闭流
            fis.close();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
            return "文件下载失败";
        }
        return "文件下载成功";
    }

}
